package com.omt.tarjimdinek.domain.message.entity;

import java.io.Serializable;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.persistence.Version;
import javax.validation.constraints.NotNull;

import org.apache.log4j.Logger;

import com.google.common.base.Objects;
import com.omt.tarjimdinek.domain.islamicLibrary.entity.Sahabi;
import com.omt.tarjimdinek.domain.member.entity.Membre;
import com.omt.tarjimdinek.support.Identifiable;

/**
 * private conversation between member and moderators
 * @author chabane
 * 
 */
@Entity
@Table(name = "a01_dscprv")
public class DiscussionPrive implements Identifiable<Long>, Serializable {

	private static final long serialVersionUID = 1L;
	private static final Logger log = Logger.getLogger(DiscussionPrive.class);

	/** ID SGBD */
	@Column(name = "CNDSCPRV", length = 11)
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;

	@Column(name = "VERSION", precision = 10)
	@Version
	private Integer version;

	/** category of discussion */
	@NotNull
	@JoinColumn(name = "CNCTGMSG", nullable = false)
	@ManyToOne
	private CategorieMessage categorieMessage;

	@OneToMany(mappedBy = "discussionPrive", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	private List<MessagePrive> listeMessagePrive;

	/** member who beginning conversation */
	@NotNull
	@JoinColumn(name = "CNMBR", nullable = false)
	@ManyToOne
	private Membre initiateur;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public Integer getVersion() {
		return version;
	}

	public void setVersion(Integer version) {
		this.version = version;
	}

	public CategorieMessage getCategorieMessage() {
		return categorieMessage;
	}

	public void setCategorieMessage(CategorieMessage categorieMessage) {
		this.categorieMessage = categorieMessage;
	}

	public List<MessagePrive> getListeMessagePrive() {
		return listeMessagePrive;
	}

	public void setListeMessagePrive(List<MessagePrive> listeMessagePrive) {
		this.listeMessagePrive = listeMessagePrive;
	}

	public Membre getInitiateur() {
		return initiateur;
	}

	public void setInitiateur(Membre initiateur) {
		this.initiateur = initiateur;
	}

	@Transient
	public boolean isIdSet() {
		return id != null && id.compareTo(Long.valueOf(0)) != 0;
	}

	/**
	 * equals implementation using a business key.
	 */
	public boolean equals(Object other) {
		return this == other
				|| (other instanceof Sahabi && hashCode() == other.hashCode());
	}

	public int hashCode() {
		int hashCode = Objects.hashCode(getId());
		return hashCode;
	}

	/**
	 * Construct a readable string representation for this instance.
	 * 
	 * @see java.lang.Object#toString()
	 */
	public String toString() {
		return Objects.toStringHelper(this) //
				.add("id", getId()) //
				.add("initiateur", getInitiateur()) //
				.add("listeMessagePrive", getListeMessagePrive()) //
				.add("categorieMessage", getCategorieMessage()) //
				.add("version", getVersion()) //
				.toString();
	}
}
